package main

import (
	"fmt"
	"math"
	//"strconv"
)

type Abser interface {
	Abs() float64
}

type MyRound interface {
	MyRound() int
}

func main() {
	var a Abser
	f := MyFloat(-math.Sqrt2)
	v := Vertex{3.1, 4}
	fmt.Println("v=", v)

	a = f  // a MyFloat 实现了 Abser
	a = &v // a *Vertex 实现了 Abser

	// 下面一行，v 是一个 Vertex（而不是 *Vertex）
	// 所以没有实现 Abser。
	//a = v //赋值 会报错 why?

	fmt.Println(a.Abs())

	var myRound MyRound
	myRound = f
	fmt.Println(myRound.MyRound())

}

type MyFloat float64

func (f MyFloat) Abs() float64 {
	if f < 0 {
		return float64(-f)
	}
	return float64(f)
}

func (f MyFloat) MyRound() int {
	return int(f)
}

type Vertex struct {
	X, Y float64
}

func (v *Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func (v Vertex) String() string {
	return fmt.Sprintf("x:, %v, y: %v", v.X, v.Y)
	//return string(v.X)
}
